﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 按钮练习
{
    public delegate void Dlgt(int i);

    class Program
    {
        // 在类的内部，不管声明事件为public还是protected，该事件在类的外部都不能调用，只能通过+=和-=去注册或者注销
        // 发送事件的类称为发行者，接收事件的类称为订阅者。事件的触发必须在发行者内部，在客户端不能触发

        static void Main(string[] args)
        {
            Player player = new Player();
            Console.WriteLine(player.GoldNum);

            Button btn = new Button();

            // 使用委托
            //btn.DlClick += player.AddG;
            // 委托可以在类的外部调用
            //btn.DlClick(10);
            // 事件不能在外部调用
            //btn.EventClick();

            // 使用事件
            btn.EventClick += player.AddG;
            btn.OnClick(10);
            Console.WriteLine(player.GoldNum);
        }
    }
    class Player
    {
        public int GoldNum { get; set; }
        public Player()
        {
            GoldNum = 1000;
        }
        public void AddG(int i)
        {
            GoldNum += i;
        }
    }

    class Button
    {
        // 声明一个委托的变量
        public Dlgt DlClick;

        //声明一个事件
        public event Dlgt EventClick;

        public void OnClick(int i)
        {
            //if (DlClick != null)
            //{
            //    DlClick(i);
            //}
            if (EventClick != null)
            {
                EventClick(i);
            }
        }
    }
}
